Grafanaのdatasourceをスクリプトで一括登録する
About
お久しぶりです。tjinjinです。ちょいネタです。
背景
弊プロダクトのAWSアカウント数がどんどん増えて来ており、マネジメントコンソールでswitch roleしながら管理するのは辛くなって来ました。本番はdatadog入れてはいるものの、その他のアカウントもそれなりの数があるのでcloudwatchの情報をローカルで見るべく個人的にGrafanaを使っています。
docker-composeでGrafanaを立てる
まずGrafanaを立てます。
version: '3' volumes: grafana_data: {} services: grafana: image: grafana/grafana ports: - "3000:3000" volumes: - ./grafana_data:/var/lib/grafana - ~/.aws/credentials:/usr/share/grafana/.aws/credentials:ro environment: - GF_SECURITY_ADMIN_PASSWORD=foobar - GF_USERS_ALLOW_SIGN_UP=false
ホストマシン上の~/.aws/credentials
をマウントしているので、そのまま利用できて便利です。localhost:3000にアクセスするとログイン画面が出ます。
datasourceを一括で登録するスクリプト
GrafanaはAPIがあるのでスクリプト経由で設定しています。
# user画面からkeyを発行する require 'net/http' require 'json' def create_datasouce(name, region, arn) url = URI.parse('http://localhost:3000/api/datasources') req = Net::HTTP::Post.new(url.request_uri) # 発行したtokenをheaderに入れます req['Authorization'] = 'Bearer xxx' req['Accept'] = 'application/json' req['Content-type'] = 'application/json' req.body = { "name": "#{name} CW", "type": "cloudwatch", "url": "", "access": "proxy", "jsonData": { "timeField": "@timestamp", "authType": "arn", "defaultRegion": "#{region}", "assumeRoleArn": "#{arn}" }, "secureJsonFields": {}, "database": "" }.to_json res = Net::HTTP.start(url.host, url.port) do |http| http.request(req) end puts name puts res.code puts res.body end accounts = [ { name: "test", value: { arn: "arn:aws:iam::012345678901:role/hogehoge", region: "ap-northeast-1" } }, ] accounts.each do |line| create_datasouce(line[:name], line[:value][:region], line[:value][:arn]) end
あとはaccountsのところに追記していって実行すれば完成です。
$ ruby create_datasource.rb
これでdatasourceは登録できました。あとは適当にちょちょいとdashboardをimportすれば完成です。dashboardはいろいろあるのでこの辺から探すとよさそうです。 https://grafana.com/dashboard